/**
 * \file wrapper.h
 * \brief Interfacage entre le C++ et le C#
 * \author ARTUR Vincent
 * \author LAPERDRIX Pierre
 * \version 1.0
 */


#ifndef __WRAPPER__
#define __WRAPPER__

#include "../algorithmes/genMap.h"
#include "../algorithmes/combat.h"
#include "../algorithmes/suggestion.h" 
#include "../algorithmes/placement.h"
#pragma comment(lib, "algorithmes.lib")

using namespace System;

namespace Wrapper {

//************** WCOMBAT **********************************/

/**
 * \class WCombat
 * \brief Classe gerant les combats
 */
public ref class WCombat{
private:
	/*!< Pointeur sur un objet de type Combat de la bibliotheque statique C++ */
	Combat* combat;
public:
	/**
	 * \fn WCombat
	 * \brief Constructeur de WCombat
	 */
	WCombat(){combat=Combat_new();}

	/**
	 * \fn ~WCombat()
	 * \brief Destructeur de WCombat
	 */
	~WCombat(){Combat_delete(combat);}

	/**
	 * \fn int* attaque(int* tableAtt,int* tableDef,int nbCoups)
	 * \brief Algorithme de gestion de combat
	 * \param tableAtt le tableau des caracteristiques de l'attaquant
	 * \param tableDef la tableau des caracteristiques du defenseur
	 * \param nbCoups le nombre de "tours de combat"
	 * \return un tableau contenant les PV restants des protagonistes ainsi que le nombre de coups restants */
	int* attaque(int* tableAtt,int* tableDef,int nbCoups){
		return combat->attaque(tableAtt,tableDef,nbCoups);
	}
};


//************** WGENMAP **********************************/

/**
 * \class WGenMap
 * \brief Classe gerant la generation de cartes
 */
public ref class WGenMap{
private:
	/*!< Pointeur sur un objet de type GenMap de la bibliotheque statique C++ */
	GenMap* genmap;
public:

	/**
	 * \fn WGenMap()
	 * \brief Constructeur de WGenMap
	 */
	WGenMap(){genmap=GenMap_new();}

	/**
	 * \fn ~WGenMap
	 * \brief Destructeur de WGenMap
	 */
	~WGenMap(){GenMap_delete(genmap);}

	/**
	 * \fn int** genererCarte(int n)
	 * \param n la taille de la carte a generer
	 * \return la matrice d'entiers correspondant aux cases de la carte
	 */
	int** genererCarte(int n){
		return genmap->genererCarte(n);
	}
};

//************** WSUGG **********************************/

/**
 * \class WSugg
 * \brief Classe gerant la suggestion de cases pour la creation d'une ville
 */
public ref class WSugg{
private:
	/*!< Pointeur sur un objet de type Suggestion de la bibliotheque statique C++ */
	Suggestion* sugg;
public:

	/**
	 * \fn WSugg()
	 * \brief Constructeur de WSugg
	 */
	WSugg(){sugg=Suggestion_new();}

	/**
	 * \fn ~WSugg()
	 * \brief Destructeur de WSugg
	 */
	~WSugg(){Suggestion_delete(sugg);}

	/**
	 * \fn int** suggerer(int** cases,int** ennemis,int** villes,int taille)
	 * \brief Algorithme de suggestion de cases pour la creation d'une ville
	 * \param cases la matrice de cases de la carte
	 * \param ennemis la matrice contenant les positions des unites ennemies sur la carte
	 * \param taille la taille de la carte
	 * \return une matrice indiquant les cases selectionnnes par l'algorithme
	 */
	int** suggerer(int** cases,int** ennemis,int** villes,int taille){
		return Suggestion_suggerer(sugg,cases,ennemis,villes,taille);
	}
};

//************** WPLAC **********************************/

/**
 * \class WPlac
 * \brief Classe gerant le placement des unites a la creation de la partie
 */
public ref class WPlac{
private:
	/*!< Pointeur sur un objet de type Placement de la bibliotheque statique C++ */
	Placement* plac;
public:

	/**
	 * \fn WPlac()
	 * \brief Constructeur de WPlac
	 */
	WPlac(){plac=Placement_new();}

	/**
	 * \fn ~WPlac()
	 * \brief Destructeur de WPlac
	 */
	~WPlac(){Placement_delete(plac);}

	/**
	 * \fn int* placer(int numJoueur, int nbJoueur, int taille)
	 * \brief Algorithme de placement des unites
	 * \param numJoueur le numero du joueur
	 * \param nbJoueur le nombre de joueurs de la partie
	 * \param taille la taille de la carte
	 * \return un tableau contenant le placement de la premiere unite
	 */
	int* placer(int numJoueur, int nbJoueur, int taille){
		return Placement_placer(plac,numJoueur,nbJoueur,taille);
	}
};

}
#endif
